package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 标准流：IO流处理异常对象
 *
 * 高级流：BufferedOutputStream   缓冲输出流  写  box.txt
 *       BufferedInputStream     缓冲输入流  读入
 */
    public class IOSAPI {
     /**
      * 缓冲输入流：具备功能：合理传输数据  效率提高
      *
      * 构造器具备：添加字符集:UTF8万国码
      * new BufferedOutputStream(低级流引用，size：存字节数组【指定】)
      * 问题1.不能指定字符集
      *    2.不能按照字符读取
      */
    @Test
    public void testBIS(){
   /* //创建低级流
    FileInputStream fis=new FileInputStream("bos.txt");
    //创建高级流---指定字符集---缓冲不具备功能---新【转换流】
    BufferedOutputStream bos=new BufferedOutputStream(fis);
    /**
     * read()---读:一个字节，字节数组---->专门读文字
    bos.read();*/
    }
    /**高级流
     * 针对于缓冲输出/入功能上的限定---传输：文本
     *
     * 字符流【转换流】---解决：缓冲输入流读取单位 为字节问题
     * InputStreamReader 读取单位：字符
     * OutputStreamWriter  写出单位：字符 调用字符串getBytes写出文本
     * 需求：重新写流---针对：文字  写出文本：osw.txt
     */
    @Test
    public void testOSW(){
    //标准流：1.置空流
    FileOutputStream fos=null;
    OutputStreamWriter osw=null;
    try {
    //标准流：2.捕获异常
    //创建低级流
    fos=new FileOutputStream("osw.txt");
    //不考虑效率---只传输文本--字符输出流：输出单位字符形式
    //字符流：都可以在构造器第二个参数指定编码集
    osw=new OutputStreamWriter(fos,"UTf8");
    //write() 直接写出文本【不需要将文本转换为字节数组】
    osw.write("给老铁来个双击~~");
    osw.write("666");//换行：字符：char
    osw.write("777");
    } catch (FileNotFoundException e) {
       e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
       e.printStackTrace();
    }catch (IOException e) {
       e.printStackTrace();
    }finally {
    //关闭高级流：字符输出流
    if (osw!=null)
    try {
    osw.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

    /**高级流【处理流】---转换流【字符流】，特点：套在低级流上，被其他高级流套上【传输单位：字符】
     * 字符输入流 ---  单元测试：testISR()  读入  文本【字符串？】
     * 字符输出流 ---  单元测试：testOSW()  写出  文本【字符串】
     * InputStreamReader  字符输入流  不可以读文本
     * 高级流【处理流】---转换流【字符流】---缓冲字符流：解决读入、写出都是字符形式
     * BufferedReader  缓冲字符输入流----解决:InputStreamReader读入字节形式
     *                                    BufferedReader读入字符形式
     *  BufferedWriter
     * 需求：ISR字符输入流读取 osw.txt
     *      ①当前代码转换为标准IO流：捕获所有异常
     *      ②读取每行文本？ readLine()  提示：不为null代表文本写出
     *      写出：1    参考：CV复制粘贴
     *      777
     *
     */
    @Test
    public void testISR() throws IOException {
    //创建低级流
    FileInputStream fis=new FileInputStream("osw.txt");
    //创建高级流---转换流---字符输入流，目的：指定编码集---UTF8
    InputStreamReader isr=new InputStreamReader(fis,"UTf8");
    //读  read()  问题：读入数据单位：字节，而不是字符，读字符
    //            转换流---套高级流：缓冲字符输入/出流
    //创建高级流---针对转换流中：字符输入流无法读取形式：
    //                       字符的情况---缓冲字符输入流
    BufferedReader br=new BufferedReader(isr);
        /**
         * BufferedReader类
         * readLine() 读取若干字符串，直到读到没有换行符为止
         */
    //接收输出字符串
    String line=null;
    //判断条件：文本中一直有内容，一直读 一行文本(line=br.readLine())!=null  一行文本
    while((line=br.readLine())!=null ){
        System.out.println("打印读到字符串："+line);
    }
    }

    /**
     * 作业2：读取IOSAPI.java文件---所有代码--写出控制台
     */

    @Test
    public void testHomeWork2() throws IOException {
    //1.创建低级流---读入---找IOSAPI.java   代表路径：File.separator
    //路径：src\main\java\com\tedu\api\io\IOSAPI.java
        String filePath="src"+
        File.separator+"main"+
        File.separator+"java"+
        File.separator+"com"+
        File.separator+"tedu"+
        File.separator+"api"+
        File.separator+"io"+
        File.separator+"IOSAPI.java";
    //2.创建高级流---【读取内容是文本】---转换流---无法读取文本【int】
    try (BufferedReader br =
    new BufferedReader(new InputStreamReader
    (new FileInputStream(filePath), "UTF-8"))) {
    String line;//声明变量
    //3.创建高级流---缓冲输入流---读取文本
    while ((line = br.readLine()) != null) {
    System.out.println("打印读到的字符串: " + line);
    }
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
        //4.创建变量：字符串类型--保存每次读取的一行文本

    //5.一直读入：每行文本保存line中，如果line不为null，一直读

    //6.关闭高级流



    /**
     * 高级流：
     * BufferedWriter---低配版本输出流【缓冲输出流】
     * PrintWriter---高配版本输出流【字符输出流】
     * 1.高级流不能直接创建---直接创建【不需要创建低级流】--封装
     * 2.封装内存所有流的特点
     * 需求：写出文件pw.txt----文本内容，需要指定编码集：UTF8
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
     //低级流：输出流
     FileOutputStream fos=new FileOutputStream("pw.txt");
     //高级流：转换流，功能：指定编码集
     OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF8");
     // 级流：缓冲流，功能：提高效率
    BufferedWriter bw=new BufferedWriter(osw);
    //创建高级流:低级流：输出流+转换流+缓冲流
    PrintWriter pw=new PrintWriter("pw.txt","UTF8");
    //写出功能：print()  打印一行文本 不换行
    //        println() 打印一行文本 换行
    pw.print("你就是");
    pw.println("我的小可爱");
    pw.close();

    }




   /* @Test
    public void testISR1(){
    //创建低级流
    FileInputStream fis=null;
    //创建高级流---转换流---字符输入流
    InputStreamReader isr=null;
    BufferedReader br=null;
    String line=null;
    try {
    fis=new FileInputStream("osw.txt");
    isr=new InputStreamReader(fis);
    //读  read()  问题：读入数据单位：字节，而不是字符，读字符
    //            转换流---套高级流：缓冲字符输入/出流
    //创建高级流---针对转换流中：字符输入流无法读取形式：
    //                       字符的情况---缓冲字符输入流
    br=new BufferedReader(isr);
    line= br.readLine();
    }catch (FileNotFoundException e){
        e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }catch (Exception e){
        e.printStackTrace();
    } finally {
    if (br!=null)
    try {
    br.close();
    } catch (IOException e) {
       e.printStackTrace();
    }
    }
    System.out.println("打印读字符串："+line);
    }*/
    }
